package com.uchengwang.ui.cm_ui.rychat.msgtype;

import android.os.Parcel;
import android.util.Log;

import org.json.JSONException;
import org.json.JSONObject;

import java.io.UnsupportedEncodingException;

import io.rong.common.ParcelUtils;
import io.rong.imlib.MessageTag;
import io.rong.imlib.model.MessageContent;

/**
 * Created by U城网 on 2017/10/20.
 * 发送U城自定义消息
 * //1-U学，2-U赛，3-U行，4-U用，5-U公益活动倡议，6-U公益失物招领,7-社团活动, 8-社团分享)  9校吧帖子 10社团纳新[当为社团纳新时, ID为社团账号]
 11 享说动态 12推荐群[当为推荐群时 id为群ID title:群名称 content:群描述 cover:群logo ]
 */

@MessageTag(value = "UC:UcTypeMsg", flag = MessageTag.ISCOUNTED | MessageTag.ISPERSISTED)

public class UcTypeMessage extends MessageContent {
    //自定义的属性
    private String ucTitle;//标题
    private String ucContent;//内容
    private String ucCover;//背景图
    private long ucId;//U城信息ID
    private int ucType;//U城类别

    public UcTypeMessage(){}

    /*
    *
    * 实现 encode() 方法，该方法的功能是将消息属性封装成 json 串，
    * 再将 json 串转成 byte 数组，该方法会在发消息时调用，如下面示例代码：
    * */
    @Override
    public byte[] encode() {
        JSONObject jsonObj = new JSONObject();

        try {
            jsonObj.put("ucTitle", this.getUcTitle());
            jsonObj.put("ucContent",this.getUcContent());
            jsonObj.put("ucCover", this.getUcCover());
            jsonObj.put("ucId",this.getUcId());
            jsonObj.put("ucType", this.getUcType());

        } catch (JSONException e) {
            Log.e("JSONException", e.getMessage());
        }

        try {
            return jsonObj.toString().getBytes("UTF-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return null;
    }

    /*
    * 覆盖父类的 MessageContent(byte[] data) 构造方法，该方法将对收到的消息进行解析，
    * 先由 byte 转成 json 字符串，再将 json 中内容取出赋值给消息属性。
    * */
    public UcTypeMessage(byte[] data) {
        String jsonStr = null;

        try {
            jsonStr = new String(data, "UTF-8");
        } catch (UnsupportedEncodingException e1) {
            e1.printStackTrace();
        }

        try {
            JSONObject jsonObj = new JSONObject(jsonStr);

            if (jsonObj.has("ucTitle"))
                setUcTitle(jsonObj.optString("ucTitle"));

            if (jsonObj.has("ucContent"))
                setUcContent(jsonObj.optString("ucContent"));

            if (jsonObj.has("ucCover"))
                setUcCover(jsonObj.optString("ucCover"));

            if (jsonObj.has("ucId"))
                setUcId(jsonObj.optLong("ucId"));

            if (jsonObj.has("ucType"))
                setUcType(jsonObj.optInt("ucType"));


        } catch (JSONException e) {
            Log.d("JSONException", e.getMessage());
        }
    }

    //给消息赋值。
    public UcTypeMessage(Parcel in) {
        setUcTitle(ParcelUtils.readFromParcel(in));//该类为工具类，消息属性
        //这里可继续增加你消息的属性
        setUcContent(ParcelUtils.readFromParcel(in));//该类为工具类，消息属性
        setUcCover(ParcelUtils.readFromParcel(in));//该类为工具类，消息属性
        //这里可继续增加你消息的属性
        setUcId(ParcelUtils.readLongFromParcel(in));//该类为工具类，消息属性
        setUcType(ParcelUtils.readIntFromParcel(in));//该类为工具类，消息属性
    }

    /**
     * 读取接口，目的是要从Parcel中构造一个实现了Parcelable的类的实例处理。
     */
    public static final Creator<UcTypeMessage> CREATOR = new Creator<UcTypeMessage>() {

        @Override
        public UcTypeMessage createFromParcel(Parcel source) {
            return new UcTypeMessage(source);
        }

        @Override
        public UcTypeMessage[] newArray(int size) {
            return new UcTypeMessage[size];
        }
    };

    @Override
    public int describeContents() {
        return 0;
    }

    /**
     * 将类的数据写入外部提供的 Parcel 中。
     * @param dest  对象被写入的 Parcel。
     * @param flags 对象如何被写入的附加标志。
     */
    @Override
    public void writeToParcel(Parcel dest, int flags) {
        ParcelUtils.writeToParcel(dest, getUcTitle());
        ParcelUtils.writeToParcel(dest, getUcContent());
        ParcelUtils.writeToParcel(dest, getUcCover());
        ParcelUtils.writeToParcel(dest, getUcId());
        ParcelUtils.writeToParcel(dest, getUcType());
    }

    public String getUcTitle() {
        return ucTitle;
    }

    public void setUcTitle(String ucTitle) {
        this.ucTitle = ucTitle;
    }

    public String getUcContent() {
        return ucContent;
    }

    public void setUcContent(String ucContent) {
        this.ucContent = ucContent;
    }

    public String getUcCover() {
        return ucCover;
    }

    public void setUcCover(String ucCover) {
        this.ucCover = ucCover;
    }

    public long getUcId() {
        return ucId;
    }

    public void setUcId(long ucId) {
        this.ucId = ucId;
    }

    public int getUcType() {
        return ucType;
    }

    public void setUcType(int ucType) {
        this.ucType = ucType;
    }
}
